package proyectobdii;

import java.util.LinkedList;

class Table {
    private String nombre;
    private String pk;
    private LinkedList<Parameter> columnas; // se utiliza la clase parametro xq es igual a una columna
    private LinkedList<Trigger> triggers;
    private LinkedList<Unique> uniques;
    private LinkedList<Index> index;

    public String toString(){
        return "TABLA: "+nombre+",pk:"+pk+",uniques:"+uniques.toString()+"\n"+columnas.toString()+"\n"+triggers.toString()+"\n";
    }

    public Table(String nombre,String pk, LinkedList<Parameter> columnas,LinkedList<Unique> uniques,LinkedList<Trigger> triggers, LinkedList<Index> index){
        this.nombre=nombre;
        this.pk=pk;
        if(uniques==null){
            this.uniques= new LinkedList<Unique>();
        }else{
            this.uniques=uniques;
        }
        if(columnas==null){
            this.columnas= new LinkedList<Parameter>();
        }else{
            this.columnas=columnas;
        }
        if(triggers==null){
            this.triggers= new LinkedList<Trigger>();
        }else{
            this.triggers=triggers;
        }if(index==null){
            this.index=new LinkedList<Index>();
        }else{
            this.index=index;
        }

    }

    public String getNombre(){
        return nombre;
    }

    public String getPk(){
        return pk;
    }

    public LinkedList<Parameter> getColumnas(){
        return columnas;
    }

    public boolean equals(Table other){
        return compareTo(other)==0;
    }

    public LinkedList<Trigger> getTriggers() {
        return triggers;
    }

    public void setUniques(LinkedList<Unique> uniques) {
        this.uniques = uniques;
    }

    public LinkedList<Unique> getUniques() {
        return uniques;
    }
    
    public LinkedList<Index> getIndex(){
        return index;
    }

    public void setTriggers(LinkedList<Trigger> triggers) {
        this.triggers = triggers;
    }

    public void setPk(String pk) {
        this.pk = pk;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setColumnas(LinkedList<Parameter> columnas) {
        this.columnas = columnas;
    }

    public int compareTo(Table other){
        //si son exactamente iguales retorna 0
        //si tienen el mismo nombre pero distinta estructura 1
        //si no coincide en nombre retorna -1
        if(nombre.compareTo(other.nombre)==0){
            if(pk.equals(other.getPk()) && equalsLinkedList(columnas,other.getColumnas()) && uniques.equals(other.uniques) && equalsLinkedList2(triggers, other.triggers) && equalsLinkedList3(index,other.index)){
                return 0;
            }else{
                return 1;
            }
        }else{
            return -1;
        }
    }

    private boolean equalsLinkedList(LinkedList<Parameter> l1,LinkedList<Parameter> l2 ){
        int longitud=l1.size();
        if(longitud==l2.size()){
            boolean bandera=true;
            for(int i=0;i<longitud && bandera;i++){
               bandera= bandera && l1.get(i).equals(l2.get(i));
            }
            return bandera;
        }else{
            return false;
        }
    }
    private boolean equalsLinkedList2(LinkedList<Trigger> l1,LinkedList<Trigger> l2 ){
        int longitud=l1.size();
        if(longitud==l2.size()){
            boolean bandera=true;
            for(int i=0;i<longitud && bandera;i++){
               bandera= bandera && l1.get(i).equals(l2.get(i));
            }
            return bandera;
        }else{
            return false;
        }
    }
    private boolean equalsLinkedList3(LinkedList<Index> l1,LinkedList<Index> l2 ){
        int longitud=l1.size();
        if(longitud==l2.size()){
            boolean bandera=true;
            for(int i=0;i<longitud && bandera;i++){
               bandera= bandera && l1.get(i).equals(l2.get(i));
            }
            return bandera;
        }else{
            return false;
        }
    }
}
